// 路由鉴权:鉴权,项目当中路由能不能被的权限的设置(某一个路由什么条件下可以访问、什么条件下不可以访问)
import router from "@/router"
import setting from './setting.js'
import nprogress from 'nprogress'
// 引入进度条样式
import 'nprogress/nprogress.css'

nprogress.configure({showSpinner: false})
// 获取用户相关的小仓库内部token数据,去判断用户是否登录成功
import useUserStore from './store/modules/user'
import pinia from './store'
import {isRelogin} from "@/utils/request"

const userStore = useUserStore(pinia)
// 全局守卫:项目当中任意路由切换都会触发的钩子
router.beforeEach(async (to, from, next) => {
    document.title = `${setting.title} - ${to.meta.title}`
    // to:你将要访问那个路由
    // from:你从来个路由而来
    // next:路由的放行函数
    nprogress.start()
    const token = userStore.token
    const username = userStore.user.name

    if (token) {
        if (to.path === '/login') {
            next({ path: '/' })
        } else {
            if (username) {
                next()
            } else {
                try {
                    isRelogin.show = true
                    await userStore.userInfo()
                    isRelogin.show = false
                    // 动态添加404页面
                    router.addRoute({
                        path: '/:pathMatch(.*)*',
                        component: () => import('@/views/error/404.vue'),
                        name: '404',
                        meta: {
                            title: '404',
                            hidden: true,
                            icon: '',
                        },
                    })
                    next({ ...to, replace: true })
                } catch (error) {
                    console.log(error)
                    // 清除 token，避免死循环
                    await userStore.userLogout()
                    next({ path: '/login', query: { redirect: to.path } })
                }
            }
        }
    } else {
        if (to.path === '/login') {
            next()
        } else if (to.path === '/register') {
            next()
        }
        else {
            next({ path: '/login', query: { redirect: to.path } })
        }
    }
})

// 全局后置守卫
router.afterEach(() => {
    nprogress.done()
})

// 第一个问题:任意路由切换实现进度条业务 ---nprogress
// 第二个问题:路由鉴权(路由组件访问权限的设置)
// 全部路由组件:登录|error|任意路由|首页|数据大屏|权限管理(三个子路由)|商品管理(四个子路由)

// 用户未登录:可以访问login,其余六个路由不能访问(指向login)
// 用户登录成功:不可以访问login[指向首页],其余的路由可以访问

